package lectureFichier;

import java.io.*;

import structureDeDonnee.Cell;
import structureDeDonnee.Matrice;
import structureDeDonnee.MatriceMyList;
import structureDeDonnee.Position;

/**
 * Cette classe sert à lire les fichiers de type LIF pour en récuperer les
 * informations suivantes: -la liste des cellules vivantes. -les valeurs
 * permettant à une cellule de naitre -les valeurs permettant à une cellule de
 * survivre
 * 
 */
public class LectureFichierLIF implements LectureFichier {

	/**
	 * une matrice trié contenant toute les cellules vivantes.
	 */
	private Matrice listeDeCellules = new MatriceMyList();

	/**
	 * les valeurs de survie, initialisées avec les valeurs par défaut au cas ou
	 * elles ne seraient pas précisées dans le fichier
	 */
	private int[] valeursDeSurvie = { 2, 3 };

	/**
	 * les valeurs de naissance, initialisées avec les valeurs par défaut au cas
	 * ou elles ne seraient pas précisées dans le fichier. La valeur 0 n'est pas
	 * une valeur de naissance acceptable: une exception sera levé si on essait
	 * de l'ajouter aux valeurs de naissance.
	 */
	private int[] valeursDeNaissance = { 3 };


	public LectureFichierLIF(){

	}

	@Override
	public void chargerFichier(String nomDuFichier) throws LectureFichierException {

		try {
			boolean regleDefinis = false;

			Cell add = null;
			int cpt = -1; //
			int posx = 0;
			int posy = 0;
			InputStream ips = new FileInputStream(nomDuFichier);
			InputStreamReader ipsr = new InputStreamReader(ips);
			BufferedReader br = new BufferedReader(ipsr);
			String ligne = br.readLine();

			while (ligne != null) {

				String[] tmp = ligne.split(" ");

				if (tmp[0].equals("#Life")) {
					// version du format lif utilisé: ne nous interesse pas
				} else if (tmp[0].equals("#D")) {
					// commentaire: ne nous interesse pas
				} else if (tmp[0].equals("#N")) {
					// indique que le jeu suit la règle "normale" pour
					// les valeurs de naissance ou de survie
					if (regleDefinis) {
						throw new LectureFichierException(
								"regle de vie et de mort definit plusieurs fois");
					}

					regleDefinis = true;
				} else if (tmp[0].equals("#R")) {
					if (regleDefinis) {
						throw new LectureFichierException(
								"regle de vie et de mort definit plusieurs fois");
					}
					definirRegle(tmp[1]);
					regleDefinis = true;
				} else if (tmp[0].equals("#P")) {

					if (tmp.length != 3) {
						throw new LectureFichierException(
								"error on the line starting with #P");
					} else {
						try {
							posx = Integer.parseInt(tmp[1]);
							posy = Integer.parseInt(tmp[2]);
						} catch (NumberFormatException e) {
							throw new LectureFichierException(
									"error on the line starting with #P");
						} finally {
							cpt = 0;
						}
					}

				} else if (tmp[0].charAt(0) != '.' || tmp[0].charAt(0) != '*') {

					if (tmp.length != 1) {
						throw new LectureFichierException(
								"error on the line describing the game");
					} else {
						for (int i = 0; i < tmp[0].length(); ++i) {
							if (tmp[0].charAt(i) == '*') {
								add = new Cell(new Position(posx + i, posy
										- cpt));
								listeDeCellules.add(add);
							}
						}
						cpt++;
					}

				}
				ligne = br.readLine();
			}
			br.close();

		} catch (IOException e) {
			throw new LectureFichierException("erreur le fichier n'existe pas");
		}
		
	}
	
	/**
	 * Parsing de la ligne correspondant aux valeurs de vie et naissance
	 * 
	 * @param s
	 *            la ligne sous forme de string
	 * @throws LectureFichierException
	 *             exception levé si les valeurs de naissance ou de survie ne
	 *             sont pas correctement écritent ou que 0 est une valeur de
	 *             naissance.
	 */
	private void definirRegle(String s) throws LectureFichierException {

		String valeurs[] = s.split("/");

		if (valeurs.length != 2)
			throw new LectureFichierException(
					"les valeurs de naissance et de survis ne sont pas correctement écritent");

		valeursDeSurvie = new int[valeurs[0].length()];
		valeursDeNaissance = new int[valeurs[1].length()];
		for (int i = 0; i < valeursDeSurvie.length; i++) {
			valeursDeSurvie[i] = Character
					.getNumericValue(valeurs[0].charAt(i));
		}
		for (int i = 0; i < valeursDeNaissance.length; i++) {
			valeursDeNaissance[i] = Character.getNumericValue(valeurs[0]
					.charAt(i));
			if (valeursDeNaissance[i] == 0)
				throw new LectureFichierException(
						"0 n'est pas une valeur de naissance acceptable");
		}
	}

	/**
	 * @return the listeDeCellules
	 */
	@Override
	public Matrice getListeDeCellules() {
		return listeDeCellules;
	}

	/**
	 * @return the valeursDeVie
	 */
	@Override
	public int[] getValeursDeSurvie() {
		return valeursDeSurvie;
	}

	/**
	 * @return the valeursDeMort
	 */
	@Override
	public int[] getValeursDeNaissance() {
		return valeursDeNaissance;
	}



}
